package godzilla.ciudad.estructuras;

import godzilla.ciudad.Direccion;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;

import org.json.JSONObject;
import org.json.JSONString;

public class Superficie implements JSONString {
	
	private Estructura estructura;
	private HashMap<String,Superficie> vecinos;
	private boolean esAgua;

	
	public Superficie(){
		vecinos = new HashMap<String,Superficie>();
		this.esAgua = false;
		this.estructura=null;

	}

	public void construir(Estructura estructura) throws NoSePuedeConstruirAquiException {
		
		if(!this.estaVacia()) throw new NoSePuedeConstruirAquiException();
		
		if( (estructura.seConstruyeSobreAgua() && this.esAgua) || (!estructura.seConstruyeSobreAgua() && !this.esAgua) ){
			this.estructura = estructura;
		} else throw new NoSePuedeConstruirAquiException();
		
	}

	public boolean estaVacia() {

		if (this.estructura==null) return true;
		else return false;
	}

	public Estructura estructuraContenida() {
		
		if (this.estaVacia()) return new TerrenoVacio();
		else return estructura;
	}

	public void vincularCon(Superficie superficie, Direccion direccion) {
		
		vecinos.put(direccion.nombre(),superficie);
		//vecinos[direccion.verDireccion()] = superficie;
		superficie.vecinos.put(direccion.direccionOpuesta().nombre(), this);
		//superficie.vecinos[direccion.direccionOpuesta().verDireccion()] = this;
		
	}

	public Superficie verVecinoEn(Direccion direccion){
		

		return vecinos.get(direccion.nombre());

	}

	public LinkedList<Superficie> verListaDeVecinos() {
		LinkedList<Superficie> listaDeVecinos = new LinkedList<Superficie>();
		Iterator<Superficie> i = vecinos.values().iterator();
		
		while (i.hasNext()){
			listaDeVecinos.add(i.next());
		}

		return listaDeVecinos;
	}

	public void destruirEstructura() {
		this.estructura = null;
		
	}

	public void inundar() {

		this.esAgua = true;
		
	}

	public boolean esAgua() {
		return this.esAgua;
	}

	public static Superficie obtenerObjetoDesdeJSON(String cadenaJSON) {
		JSONObject objetoJSON = new JSONObject(cadenaJSON);
		Superficie superficie = new Superficie();
		
		superficie.esAgua= objetoJSON.getBoolean("EsAgua");
		if (objetoJSON.has("Estructura")) superficie.estructura = Estructura.obtenerObjetoDesdeJSON(objetoJSON.getJSONObject("Estructura").toString());
		else superficie.estructura=null;
		
		
		return superficie;
		
		
	}

	@Override
	public String toJSONString() {
		JSONObject objetoJSON = new JSONObject();
		objetoJSON.put("EsAgua", this.esAgua);
		if (this.estructura!=null) objetoJSON.put("Estructura", new JSONObject(this.estructura.toJSONString()));
		
		return objetoJSON.toString();
	}


}
